package com.zenithmind.note.pojo.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.zenithmind.common.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

/**
 * 笔记标签实体类
 * 遵循面向对象设计原则：
 * 1. 单一职责：只负责标签数据和标签相关业务逻辑
 * 2. 封装性：提供业务方法控制标签状态和使用
 * 3. 数据完整性：确保标签名称的唯一性
 */
@EqualsAndHashCode(callSuper = true)
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Schema(name = "笔记标签实体", description = "笔记标签实体")
@TableName("note_tag")
public class NoteTag extends BaseEntity {

    @Schema(description = "标签名称")
    @NotBlank(message = "标签名称不能为空")
    @Size(max = 50, message = "标签名称长度不能超过50个字符")
    private String name;

    @Schema(description = "标签颜色")
    @Size(max = 20, message = "标签颜色长度不能超过20个字符")
    private String color;

    @Schema(description = "标签图标")
    @Size(max = 100, message = "标签图标长度不能超过100个字符")
    private String icon;

    @Schema(description = "排序")
    private Integer sort;

    @Schema(description = "是否系统预设")
    private Boolean isSystem;

    @Schema(description = "用户ID")
    private String userId;

    @Schema(description = "笔记数量")
    @TableField(exist = false)
    private Integer noteCount;

    // ==================== 业务方法 ====================

    /**
     * 判断是否为系统预设标签
     *
     * @return 是否为系统预设
     */
    public boolean isSystemTag() {
        return this.isSystem != null && this.isSystem;
    }

    /**
     * 判断是否为用户自定义标签
     *
     * @return 是否为用户自定义
     */
    public boolean isUserTag() {
        return !isSystemTag();
    }

    /**
     * 判断是否可以被删除
     *
     * @return 是否可删除
     */
    public boolean isDeletable() {
        // 系统预设标签不能删除
        if (isSystemTag()) {
            return false;
        }

        // 有笔记使用的标签不能删除
        if (this.noteCount != null && this.noteCount > 0) {
            return false;
        }

        return true;
    }

    /**
     * 判断是否可以被编辑
     *
     * @param currentUserId 当前用户ID
     * @return 是否可编辑
     */
    public boolean isEditableBy(String currentUserId) {
        // 系统预设标签不能编辑
        if (isSystemTag()) {
            return false;
        }

        // 只有创建者可以编辑
        return currentUserId != null && currentUserId.equals(this.userId);
    }

    /**
     * 设置为系统预设标签
     */
    public void setAsSystemTag() {
        this.isSystem = true;
        this.userId = null; // 系统标签不属于任何用户
    }

    /**
     * 设置为用户自定义标签
     *
     * @param userId 用户ID
     */
    public void setAsUserTag(String userId) {
        if (userId == null || userId.trim().isEmpty()) {
            throw new IllegalArgumentException("用户ID不能为空");
        }
        this.isSystem = false;
        this.userId = userId;
    }

    /**
     * 设置标签颜色
     *
     * @param color 颜色值（支持十六进制和颜色名称）
     */
    public void setColor(String color) {
        if (color != null && color.length() > 20) {
            throw new IllegalArgumentException("标签颜色长度不能超过20个字符");
        }
        this.color = color;
    }

    /**
     * 初始化新标签的默认值
     */
    public void initializeDefaults() {
        if (this.sort == null) {
            this.sort = 0;
        }
        if (this.isSystem == null) {
            this.isSystem = false;
        }
        if (this.noteCount == null) {
            this.noteCount = 0;
        }
        if (this.color == null || this.color.trim().isEmpty()) {
            this.color = "#1890ff"; // 默认蓝色
        }
    }

    /**
     * 验证标签数据是否有效
     *
     * @return 是否有效
     */
    public boolean isValid() {
        return this.name != null && !this.name.trim().isEmpty() &&
               this.name.length() <= 50;
    }
}